
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>集合与流的结合 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>集合与流的结合 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Java流的“惰性求值”特性是什么？它有哪些好处？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">惰性求值是指流的中间操作（如 filter, map）不会立即执行，而是要等到终止操作（如 collect, forEach）出现时才开始整个处理流程。这种设计的好处包括：避免创建所有中间结果、可能因使用了limit等操作而无需处理所有元素、以及能以最优方式组合多个操作。</div>
          </div>
          <div class="card-source">来源: 中间操作vs终止操作</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">陷阱</div>
          <div class="card-question">为什么不能盲目地将 stream() 替换为 parallelStream() 来提升性能？请列举文档中提到的三个原因。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">陷阱</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为并行流并非万能，在不合适的场景下反而会导致性能问题。文档提到的原因有：1) 对于涉及数据库操作的IO密集型任务，并行可能导致连接争用；2) 当数据量不大时，线程切换的开销可能超过并行带来的好处；3) 默认的ForkJoinPool线程池不适合IO密集型操作。</div>
          </div>
          <div class="card-source">来源: 别迷信并行流</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">除了从集合（Collection）创建流之外，文档还提到了哪些创建流的方式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中还提到了其他创建流的方式，包括：1) 从文件创建，例如使用 Files.lines() 将文件的每一行作为一个元素；2) 使用 Stream.generate() 创建无限流；3) 使用 Stream.iterate() 创建无限流，例如生成一个偶数序列。</div>
          </div>
          <div class="card-source">来源: 创建流：入口比想象的多</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">根据文档，Java Stream API 存在哪些设计上的缺陷？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档指出了三个主要的设计缺陷：1) 可变性与不可变性混乱，流操作返回新集合但Java集合本身是可变的；2) terminality（终止性）太严格，流一旦被消费就不能重用；3) 基础类型的处理繁琐，需要使用IntStream、LongStream等特殊流，导致API割裂。</div>
          </div>
          <div class="card-source">来源: Stream API设计中的缺陷</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当调试复杂的流操作时，文档推荐使用哪种方法来观察流在处理过程中的中间状态？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档推荐使用 peek() 操作来调试流。peek() 可以在流的每个元素经过某个处理点时执行一个动作（例如打印到控制台），从而可以“偷看”到流在每个中间操作后的状态，而不会改变流本身。</div>
          </div>
          <div class="card-source">来源: 流操作中的那些坑 - 调试噩梦</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">文档中提到了一条关于使用并行流的“黄金法则”是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“黄金法则”是：除非你能证明并行流确实能带来显著收益，否则就老老实实用串行流。</div>
          </div>
          <div class="card-source">来源: 别迷信并行流</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在什么情况下，使用传统的for循环可能比使用Stream API更合适？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档建议，如果一个流操作写完后，自己看了三遍还是不确定它在干什么，就应该换回传统循环。特别是当逻辑涉及多个集合或条件非常复杂时，传统循环可能更清晰易懂。核心原则是代码的可读性优先于炫技。</div>
          </div>
          <div class="card-source">来源: 流操作中的那些坑 - 流不能替代所有循环</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">优化</div>
          <div class="card-question">在使用流处理大数据集时，直接使用 `collect(Collectors.toList())` 可能引发什么问题？文档建议了哪些处理方式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">优化</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">直接使用 `collect(Collectors.toList())` 会在内存中创建一个包含所有结果的巨大List，可能导致内存溢出。文档建议的优化方式包括：流的分段处理、使用自定义的终止操作来避免创建完整的副本，或者直接使用传统的Iterator来处理数据。</div>
          </div>
          <div class="card-source">来源: 内存优化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">文档提到了Java 9中的哪个新特性可以与Stream API搭配，以更优雅地替代 `filter` + `limit` 的组合？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档提到了Java 9中引入的 `takeWhile` 方法。它可以作用于流上，从头开始获取元素，直到某个条件不再满足为止，这在处理有序流时比 `filter` + `limit` 的组合更简洁有效。</div>
          </div>
          <div class="card-source">来源: 与Java 9+新特性的完美搭配</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
